<?php
/**
 * CreateTime: 2023/11/15 15:36
 * User:LinQ
 *
 *  该辅助函数库包含了一些默认会多次使用到的一些常用方法
 *
 *
 *
 *
 */


use App\Models\Logs\RequestLogsModel;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Support\Facades\Log;

if (!function_exists('c_return')) {
    /**
     * 按照约定的形式返回json字符串
     * @param mixed $data 要返回的数据
     * @param string $message 需要返回的提示
     * @param bool $status 默认是true 表示请求状态成功
     * @param string $code 状态码 默认 SUCCESS 参考状态码表
     * @param int $httpCode 网络请求状态码
     */
    function c_return(
        mixed $data,
        string $message,
        bool $status = true,
        string $code = 'SUCCESS',
        int $httpCode = 200,
        array $headers = [
            'Content-Type' => 'application/json; charset=utf-8'
        ]
    ): \Illuminate\Http\JsonResponse
    {
        $requestId = (\Symfony\Component\Uid\UuidV4::v6()->toRfc4122());
        $requestData =  response()->json	(
            [
                'status'	=> $status		,
                'code'		=> $code		,
                'data'		=> $data		,
                'message'		=> $message		,
                'httpCode'		=> $httpCode		,
                // 请求标识 用于追踪和识别特定的请求
                'requestId'     => $requestId
            ]
            ,
            $httpCode,
            $headers
        )->setEncodingOptions(JSON_UNESCAPED_UNICODE);
        Log::channel('custom')->info([
            'ip'=>request()->ip(),
            'request_data' => json_encode(request()->all(),256),
            'request_header' => json_encode(request()->header(),256),
            'request_id' => $requestId,
            'response_all' => $requestData->content()
        ]);

        return $requestData;
    }
}

if (!function_exists('success_return')) {
    /**
     * 默认成功使用这个返回 返回响应值为 200 code SUCCESS
     * @param mixed $data 要返回的数据
     * @param string $message 需要返回的提示
     * @param bool $status 默认是true 表示请求状态成功
     * @param string $code 状态码 默认 SUCCESS 参考状态码表
     * @param int $httpCode 网络请求状态码
     */
    function success_return(
        mixed $data,
        string $message,
        bool $status = true,
        string $code = 'SUCCESS',
        int $httpCode = 200,
        array $headers = [
            'Content-Type' => 'application/json; charset=utf-8'
        ]
    ): \Illuminate\Http\JsonResponse
    {
        $requestId = (\Symfony\Component\Uid\UuidV4::v6()->toRfc4122());
        $requestData =  response()->json	(
            [
                'status'	=> $status		,
                'code'		=> $code		,
                'data'		=> $data		,
                'message'		=> $message		,
                'httpCode'		=> $httpCode		,
                // 请求标识 用于追踪和识别特定的请求
                'requestId'     => $requestId
            ]
            ,
            $httpCode,
            $headers
        )->setEncodingOptions(JSON_UNESCAPED_UNICODE);

        Log::channel('custom')->info([
            'ip'=>request()->ip(),
            'request_data' => json_encode(request()->all(),256),
            'request_header' => json_encode(request()->header(),256),
            'request_id' => $requestId,
            'response_all' => $requestData->content()
        ]);

        return $requestData;
    }
}

if (!function_exists('fail_return')) {
    /**
     * 默认成功使用这个返回 返回响应值为 500 code ERROR
     * @param mixed $data 要返回的数据
     * @param string $message 需要返回的提示
     * @param bool $status 默认是 false 表示请求状态成功
     * @param string $code 状态码 默认 ERROR 参考状态码表
     * @param int $httpCode 网络请求状态码
     */
    function fail_return(
        mixed $data,
        string $message,
        bool $status = false,
        string $code = 'ERROR',
        int $httpCode = 500,
        array $headers = [
            'Content-Type' => 'application/json; charset=utf-8'
        ]
    ): \Illuminate\Http\JsonResponse
    {
        $requestId = (\Symfony\Component\Uid\UuidV4::v6()->toRfc4122());
        $requestData =  response()->json	(
            [
                'status'	=> $status		,
                'code'		=> $code		,
                'data'		=> $data		,
                'message'		=> $message		,
                'httpCode'		=> $httpCode		,
                // 请求标识 用于追踪和识别特定的请求
                'requestId'     => $requestId
            ]
            ,
            $httpCode,
            $headers
        )->setEncodingOptions(JSON_UNESCAPED_UNICODE);

        Log::channel('custom')->error([
            'ip'=>request()->ip(),
            'request_data' => json_encode(request()->all(),256),
            'request_header' => json_encode(request()->header(),256),
            'request_id' => $requestId,
            'response_all' => $requestData->content()
        ]);

        return $requestData;
    }
}

if (!function_exists('s_c_return')) {
    /** 以强制打断的形式强制返回
     * @param mixed $data 要返回的数据
     * @param string $message 需要返回的提示
     * @param bool $status 默认是true 表示请求状态成功
     * @param string $code 状态码 默认 SUCCESS 参考状态码表
     * @param int $httpCode 网络请求状态码
     */
    function s_c_return(
        mixed $data,
        string $message,
        bool $status = true,
        string $code = 'SUCCESS',
        int $httpCode = 200,
        array $headers = [
            'Content-Type' => 'application/json; charset=utf-8'
        ]
    )
    {
        echo c_return(
            $data,
            $message,
            $status,
            $code,
            $httpCode,
            $headers
        )->content();
        exit();
    }
}

if (!function_exists('s_fail_return')) {
    /** 以强制打断的形式强制返回 错误
     * @param mixed $data 要返回的数据
     * @param string $message 需要返回的提示
     * @param bool $status 默认是 false 表示请求状态成功
     * @param string $code 状态码 默认 ERROR 参考状态码表
     * @param int $httpCode 网络请求状态码 500
     */
    function s_fail_return(
        mixed $data,
        string $message,
        bool $status = false,
        string $code = 'ERROR',
        int $httpCode = 500,
        array $headers = [
                'Content-Type' => 'application/json; charset=utf-8'
            ]
        )
    {
        echo c_return(
            $data,
            $message,
            $status,
            $code,
            $httpCode,
            $headers
        )->content();
        exit();
    }
}


// ------------------------------------------- 数据处理

if (!function_exists('trim_array')){
    /**
     * @param array $arr 需要传入的数组
     * @param string $char 是否需要去除多余开头结尾字符串
     * @return array 处理后的数据
     */
    function trim_array(array $arr, string $char =""): array
    {
        return array_map(function ($value) use($char) {
            $value = trim($value);
            if($char){
                $value = trim($value,$char);
            }
            return $value;
        }, $arr);
    }
}

if (!function_exists('map_has_value')){
    /**
     * 这是操作map的
     * 判断数组中是否存在该key并且值不能为 "" null []
     * @param array $arr 需要传入的数组
     * @param string $key 检查数组中的key
     * @return bool 存在则返回 true 反之false
     */
    function map_has_value(array $arr, string $key) :bool
    {
        return isset($arr[$key]) && $arr[$key];
    }
}

if(!function_exists('get_hash_str')){
    /**
     * 根据长度生成随机字符串，默认长度为10
     * @param int $length
     * @return string
     */
    function get_hash_str(int $length = 10): string
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, strlen($characters) - 1)];
        }
        return $randomString;
    }
}


